import { userDetailApi } from '@/api';
import { formatNum, isLocal, isSuccess } from '@/utils';
import { message } from 'antd';
import store from 'storejs';

// 轮询时间
const localLunXunTime = 500 * 1000;
export const lunXunTime = isLocal() ? localLunXunTime : 4 * 1000;
export const lunXunTimeKuai = isLocal() ? localLunXunTime : 4 * 1000;

// 获取localStorage用户信息
export const userInfo = store.get('userInfo');

// 仓位tab
export const positionTabs = [
  {
    name: '全部',
    key: 'all',
  },
  {
    name: '全仓',
    key: 'allIn',
  },
  {
    name: '逐仓',
    key: 'single',
  },
];

// 快捷时间
export const quickTime = {
  '1': '近1天',
  '7': '近7天',
  '30': '近30天',
  '90': '近90天',
};

// 历史仓位的选择框
export const historyPositionFields = [
  // {
  //   name: 'side',
  //   enum: {
  //     all: '全部',
  //     long: '做多',
  //     short: '做空',
  //   },
  // },
  // {
  //   name: 'pnl',
  //   enum: {
  //     all: '全部',
  //     profit: '做多',
  //     loss: '做空',
  //   },
  // },
];

// 历史委托的选择框
export const historyEntrustFields = [
  // {
  //   name: 's1',
  //   enum: {
  //     all: '全部类型',
  //     kai: '开仓',
  //     ping: '平仓',
  //   },
  // },
  // {
  //   name: 's2',
  //   enum: {
  //     all: '全部方向',
  //     duo: '多',
  //     kong: '空',
  //   },
  // },
  // {
  //   name: 's3',
  //   enum: {
  //     start: '按创建时间',
  //     end: '按结束时间',
  //   },
  // },
];

// 成交记录的选择框
export const tradeListFields = [
  // {
  //   name: 'role',
  //   enum: {
  //     all: '全部角色',
  //     maker: 'Maker',
  //     taker: 'Taker',
  //   },
  // },
  // {
  //   name: 'side',
  //   enum: {
  //     all: '全部方向',
  //     duo: '多',
  //     kong: '空',
  //   },
  // },
];

// 仓位类型
export const positionOptions: any = [
  { value: 'all', label: '全仓' },
  { value: 'zhu', label: '逐仓' },
];

export const leverOptionsMock = [
  {
    value: '1',
    label: '1x',
  },
  {
    value: '2',
    label: '2x',
  },
  {
    value: '5',
    label: '5x',
  },
  {
    value: '10',
    label: '10x',
  },
  {
    value: '20',
    label: '20x',
  },
  {
    value: '30',
    label: '30x',
  },
  {
    value: '40',
    label: '40x',
  },
];

// 合约单位
export const contractUnits: any = [
  { name: '张', value: 'zhang' },
  { name: 'USDT', value: 'USDT', desc: '您输入的为订单市场价值，修改杠杆会改变保证金成本' },
];

/*
变更类型：
- dnw: 转入转出
- pnl: 减仓盈亏
- fee: 交易手续费
- refr: 推荐人返佣
- fund: 资金费用
- point_dnw: 点卡转入转出
- point_fee: 点卡交易手续费
- point_refr: 点卡推荐人返佣
- bonus_offset: 体验金抵扣
*/
export const fundFlowType: any = {
  dnw: '转入转出',
  pnl: '减仓盈亏',
  fee: '交易手续费',
  refr: '推荐人返佣',
  fund: '资金费用',
  point_dnw: '点卡转入转出',
  point_fee: '点卡交易手续费',
  point_refr: '点卡推荐人返佣',
};

// 资金流水的选择框
export const fundFlowFields = [
  // {
  //   name: 's1',
  //   enum: {
  //     all: '全部',
  //     BTB: 'BTB',
  //     SOSOUSDT: 'SOSOUSDT',
  //     KNCUSDTORBSUSDT: 'KNCUSDTORBSUSDT',
  //   },
  // },
  {
    name: 'type',
    enum: {
      all: '全部方向',
      ...fundFlowType,
    },
  },
];

// 调整合约列表位置
export function handleContractSort(list: any) {
  if (!Array.isArray(list) && list.length <= 0) return [];
  const tscoin = [
    'BTC_USDT',
    'YFI_USDT',
    'ETH_USDT',
    'MKR_USDT',
    'BNB_USDT',
    'TAO_USDT',
    'BCH_USDT',
    'AAVE_USDT',
    'SOL_USDT',
  ];
  const _list1: any = [];
  tscoin.forEach((xitem) => {
    const tres = list.filter((item: any) => xitem.includes(item?.contract));
    _list1.push(tres[0]);
  });
  const _list2 = list.filter((item: any) => !tscoin.includes(item?.contract));
  const res = [..._list1, ..._list2];
  return res;
}

// 下单时处理止盈止损相关内容
export const handleOrderZhiYing = ({ zhiYingInfo, num, isSell }: any) => {
  let res: any = {};
  if (zhiYingInfo?.zhiYing) {
    if (zhiYingInfo.zhiYingPrice) res.profit_trigger_price = zhiYingInfo.zhiYingPrice;
    if (zhiYingInfo.zhiSunPrice) res.loss_trigger_price = zhiYingInfo.zhiSunPrice;
    res.price_type = 0;
  }
  if (zhiYingInfo?.ice) {
    if (!!!zhiYingInfo.iceNum) {
      message.error('冰山委托数量不能为为0');
      return false;
    }
    if (zhiYingInfo?.iceNum >= num) {
      message.error('冰山委托显示数量需小于实际委托数量');
      return false;
    }
    res.iceberg = zhiYingInfo.iceNum;
    res.price_type = 0;
  }
  if (zhiYingInfo?.jianCang) {
    if (!isSell) {
      message.error('只减仓下单方向不可与持仓方向相同');
      return false;
    }
    res.reduce_only = true;
  }
  return res;
};

// 下单时处理限价、市价的参数
export function handleOrderTypePrice(curTab: any, price: any) {
  let res: any = {};
  if (curTab === 'xianJia') {
    // 限价
    res.price = price;
    res.tif = 'gtc';
  } else {
    // 市价
    res.price = 0;
    res.tif = 'ioc';
  }
  return res;
}

// 仓位,计算预估强平价
/*
预估强平价 =（开仓均价 ± 保证金 / 合约乘数 / 仓位数量）/ [ 1±（ 维持保证金率 + Taker费率）]
  逐仓保证金 = 逐仓仓位占用保证金  
  maintenance_rate
*/
export const positionNums = (data: any, contractList: any) => {
  const junjia = Number(data?.entry_price);
  const chengShu = contractList[data?.contract]?.quanto_multiplier;
  const takerFee = contractList[data?.contract]?.taker_fee_rate;
  const baoZhengNum = data?.baoZhengJin / chengShu / data?.size;
  // console.log('data?.baoZhengJin: ', data?.baoZhengJin, chengShu, data?.size);
  // console.log('baoZhengNum: ', baoZhengNum);
  const lv = Number(data?.maintenance_rate) + Number(takerFee);
  let qingPingJia = formatNum(junjia - baoZhengNum + (1 - lv), 1);
  if (data?.size < 0) formatNum(junjia + baoZhengNum + (1 + lv), 1); // 空
  const res = {
    qingPingJia,
  };
  return res;
};

export const priceTypeOptions = [
  {
    label: '最新',
    value: 0,
  },
  {
    label: '标记',
    value: 1,
  },
  {
    label: '指数',
    value: 2,
  },
];

export const weiTuoOptions = [
  {
    label: '限价',
    value: 'gtc',
  },
  {
    label: '市价',
    value: 'ioc',
  },
];

// 部分仓位区分止盈止损，找到最小止盈和最大止损
export const handelBufenZhiYingSun = (list: any) => {
  console.log('list: ', list);
  let obj: any = {
    max: null,
    min: null,
  };
  if (list.length === 0) return obj;
  const zhiyings = list?.zhiYingSunData.buFenCang.filter((item: any) => item?.trigger.rule === 1);
  console.log('zhiyings: ', zhiyings);
  const zhisuns = list?.zhiYingSunData.buFenCang.filter((item: any) => item?.trigger.rule === 2);
  if (zhiyings.length > 0)
    obj.max = Math.max(...zhiyings.map((item: any) => Number(item?.trigger?.price)));
  if (zhisuns.length > 0)
    obj.min = Math.min(...zhisuns.map((item: any) => Number(item?.trigger.price)));
  // list?.zhiYingSunData.buFenCang.forEach((item: any) => {
  //   const price = item?.trigger.price;
  //   const type = item?.trigger.rule === 1 ? '止盈' : '止损';
  //   const batch_id = item?.batch_id;
  //   const id = item?.id;
  //   console.log('item: ', price, type,
  //     // batch_id, id
  //   );
  // });
  return obj;
};

// 将部分止盈止损配对
export const getBFPDList = (arr: any[]) => {
  if (!Array.isArray(arr) || arr.length === 0) return [];
  const res: any = {};
  for (const obj of arr) {
    const id = obj?.batch_id;
    console.log('id: ', id);
    if (id in res) {
      res[id].push(obj);
    } else {
      res[id] = [obj];
    }
  }
  return Object.values(res);
};

// 实时获取用户信息
export const getUserInfoByApi = async () => {
  const userId = store.get('userInfo');
  const res: any = await userDetailApi({ id: +userId?.id });
  if (isSuccess(res)) {
    const val = res.data;
    store.set('userInfo', val);
    return val;
  } else {
    return false;
  }
};

/*
做多做空保证金按文档上的公式计算出来和你们网站上的结果也不对，示例如下：
文档的逐仓开仓保证金 = |合约张数| × 合约乘数 × 开仓均价／杠杆倍数 + |合约张数| × 合约乘数 × 开仓均价 × 平仓手续费率，起始保证金固定不变。
比特币：张数20, 乘数0.0001, 下单价96000, 杠杆20,
手续费从合约详情取的：做多手续费taker_fee_rate=0.00075, 做空手续费maker_fee_rate=-0.0001
*/
const baoZhengJinDuo = (20 * 0.0001 * 96000) / 20 + 20 * 0.0001 * 96000 * 0.00075;
const baoZhengJinKong = (20 * 0.0001 * 96000) / 20 + 20 * 0.0001 * 96000 * -0.0001;
// console.log('保证金:多', baoZhengJinDuo, '空:', baoZhengJinKong);
//结果：做多保证金9.744  做空保证金9.5808

/*
预估强平价按文档上的公式计算出来和你们网站上的结果也不对，示例如下：
文档的逐仓强平价 =（开仓均价 ± 保证金 / 合约乘数 / 仓位数量）/ [ 1±（ 维持保证金率 + Taker费率）]
比特币：张数20, 乘数0.0001, 下单价96000, 杠杆20, 保证金取上方计算的结果
手续费从合约详情取的：做多手续费taker_fee_rate=0.00075, 做空手续费maker_fee_rate=-0.0001, 维持保证金率maintenance_rate=0.004
逐仓开仓保证金 = |合约张数| × 合约乘数 × 开仓均价／杠杆倍数 + |合约张数| × 合约乘数 × 开仓均价 × 平仓手续费率，起始保证金固定不变。
保证金从上边的结果取
*/
const qpjDuo = (96000 - 9.744 / 0.0001 / 20) / (1 - (0.004 + 0.00075));
const qpjKong = (96000 + 9.5808 / 0.0001 / 20) / (1 + (0.004 + 0.00075));
// console.log('预估强平价:多', qpjDuo, '空:', qpjKong);
// 预估强平价:多 91562.92 空: 100313.91
